const crypto = require('crypto')

const algorithm = 'aes-192-cbc'
const password = 'river_sea_poetry' // 用于生成密钥的密码
const key = crypto.scryptSync(password, 'salt', 24)
const iv = Buffer.alloc(16, 0)  // 生成一个长度为16个字符的盐

// 加密
exports.encryption = (pwd) => {
    const cipher = crypto.createCipheriv(algorithm, key, iv)
    let encrypted = cipher.update(pwd, 'utf8', 'hex')
    encrypted += cipher.final('hex')
    return encrypted
}

// 解密
exports.decrypt = (pwd) => {
    const decipher = crypto.createDecipheriv(algorithm, key, iv)
    let decrypted = decipher.update(pwd, 'hex', 'utf8')
    decrypted += decipher.final('utf8')
    return decrypted
}

/*
收藏夹里有
aes加密
crypto.createCipher(algorithm, password) ：
用给定的算法和密钥，创建并返回一个 Cipher 加密算法的对象。
参数： algorithm 算法是依赖OpenSSL库支持的算法, 
例如: 'aes192' 算法等， password 是用来派生 key 和 iv 的，它必须是一个 'binary' 二进制格式的字符串或者是一个 Buffer 。

crypto.createCipheriv(algorithm, key, iv) ：
用给定的算法、密钥和向量，创建并返回一个 Cipher 加密算法的对象。
参数： algorithm 与 createCipher 方法相同， key 密钥是一个被算法使用的原始密钥， iv 是一个 初始化向量 。 key 密钥和 iv 向量必须是 'binary' 二进制格式的字符串或者是一个 Buffer 。

cipher.update(data, [input_encoding], [output_encoding]) ：更新 Cipher 类的加密数据。 data ：要更新的 Cipher 加密对象的数据，编码 input_encoding 可以是： 'utf8' 、 'ascii' 、 'binary' 。如果没有编码参数，那么 data 必须是一个 Buffer 。

参数 output_encoding 指定加密数据的输出编码，可以是： 'binary' 、 'base64' 或 'hex' ，如果未设置这个参数，将会返回一个 Buffer 。

cipher.final([output_encoding]) ：返回加密后的内容， output_encoding 为： 'binary' 、 'base64' 或 'hex' 。 如果没有提供编码格式，如果未设置这个参数，将会返回一个 Buffer 。

注意：调用 final() 后不能再用 Cipher 对象

cipher.setAutoPadding(auto_padding=true) ：设置输入数据自动填充到块大小功能，这个函数必须在 cipher.final 之前调用。如果 auto_padding 是false，那么整个输入数据的长度必须是加密器的块大小的整倍数，否则 final 会失败。这对非标准的填充很有用，例如：使用 0x0 而不是 PKCS 的填充。

cipher.setAuthTag(buffer) ：加密认证模式（目前支持：GCM），这个方法返回经过计算的认证标志Buffer 。必须在使用 final 方法完成加密后调用。

cipher.setAAD(buffer) ：对于加密认证模式（目前支持：GCM），用这个方法设置附加认证数据（ AAD ）。
*/

